package demo.javax.sql;

import java.beans.PropertyVetoException;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import demo.db.mysql.MySqlDemo;

public class ComboPooledDataSourceDemo {

    /**
     * 初始化数据源
     * 
     * @param jdbcUrl
     * @param username
     * @param password
     * @return
     * @throws PropertyVetoException
     */
    public static ComboPooledDataSource init(String jdbcUrl, String username, String password)
            throws PropertyVetoException {
        if (jdbcUrl == null || username == null || password == null) {
            throw new IllegalArgumentException("jdbc url, user, pass is null");
        }
        ComboPooledDataSource ds = new ComboPooledDataSource();
        ds.setUser(username);
        ds.setPassword(password);
        ds.setJdbcUrl(jdbcUrl);
        ds.setDriverClass(MySqlDemo.JDBC_DRIVER_V5);
//        初始化池大小
        ds.setInitialPoolSize(1);
//        如果池中数据连接不够时一次增长多少个 
        ds.setAcquireIncrement(3);
//        最少几个连接
        ds.setMinPoolSize(1);
//        最多有多少个连接
        ds.setMaxPoolSize(5);
//        每次最多可以执行多少个批处理语句
        ds.setMaxStatements(9);
//        最大空闲时间，多少秒内未使用则连接被丢弃。若为0则永不丢弃。默认值: 0
        ds.setMaxIdleTime(9000);
//        每隔多少秒检查所有连接池中的空闲连接。Default: 0
        ds.setIdleConnectionTestPeriod(5000);
//        定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ；小于等于0表示无限次
        ds.setAcquireRetryAttempts(3);
//        重新尝试的时间间隔，默认为：1000毫秒
        ds.setAcquireRetryDelay(1000);
//        获取一个connection超时时间，单位毫秒
        ds.setCheckoutTimeout(200);
        /*
         * c3p0将建一张名为该配置项的空表，并使用其自带的查询语句进行测试。如果定义了这个参数那么属性preferredTestQuery将#被忽略。
         * 你不能在这张Test表上进行任何操作，它将只供c3p0测试使用。默认值: null。由于运营平台的数据库用户没有创建表的权限，故需要发sql创建表。
         */
        ds.setAutomaticTestTable("sys_connectiontest");

        ds.setPreferredTestQuery("select 1");
//        如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
        ds.setTestConnectionOnCheckin(true);
//        一个checkout连接的超时设置，一旦一个checkout连接超时，他将物理的关闭，而不是返回池中，主要是防止连接被长期使用不释放，这个设置也是比较危险的
        ds.setUnreturnedConnectionTimeout(15);
        return ds;
    }
}
